﻿Imports System.Text

Namespace OpenCL
    ''' <summary>
    ''' プラットフォーム（GPUメーカー）
    ''' </summary>
    ''' <remarks></remarks>
    Public Class Platform

#Region "　プラットフォームID　"
        ''' <summary>プラットフォームID</summary>
        Private _ID As IntPtr = IntPtr.Zero
        ''' <summary>プラットフォームID</summary>
        Public ReadOnly Property ID() As IntPtr
            Get
                Return Me._ID
            End Get
        End Property
#End Region

#Region "　プラットフォーム名　"
        ''' <summary>プラットフォーム名</summary>
        Private _Name As String = ""
        ''' <summary>プラットフォーム名</summary>
        Public ReadOnly Property Name() As String
            Get
                Return Me._Name
            End Get
        End Property
#End Region

#Region "　ベンダー情報　"
        ''' <summary>ベンダー情報</summary>
        Private _Vendor As String = ""
        ''' <summary>ベンダー情報</summary>
        Public ReadOnly Property Vendor() As String
            Get
                Return Me._Vendor
            End Get
        End Property
#End Region

#Region "　プラットフォームのバージョン　"
        ''' <summary>プラットフォームのバージョン</summary>
        Private _Version As String = ""
        ''' <summary>プラットフォームのバージョン</summary>
        Public ReadOnly Property Version() As String
            Get
                Return Me._Version
            End Get
        End Property
#End Region

#Region "　プラットフォームのプロファイル　"
        ''' <summary>プラットフォームのプロファイル</summary>
        Private _Profile As String = ""
        ''' <summary>プラットフォームのプロファイル</summary>
        Public ReadOnly Property Profile() As String
            Get
                Return Me._Profile
            End Get
        End Property
#End Region

#Region "　拡張情報　"
        ''' <summary>拡張情報</summary>
        Private _Extensions As String = ""
        ''' <summary>拡張情報</summary>
        Public ReadOnly Property Extensions() As String
            Get
                Return Me._Extensions
            End Get
        End Property
#End Region

#Region "　デバイス一覧　"
        ''' <summary>デバイス一覧</summary>
        Private _DeviceList As DeviceCollection = Nothing
        ''' <summary>デバイス一覧</summary>
        Public ReadOnly Property DeviceList() As DeviceCollection
            Get
                Return Me._DeviceList
            End Get
        End Property
#End Region

#Region "　コンストラクタ　"
        ''' <summary>コンストラクタ</summary>
        ''' <param name="id">プラットフォームのID</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal id As IntPtr)
            Me._ID = id                                                  'プラットフォームID
            Me._Name = Me.getPlatformInfo(PlatformInfo.Name)             'プラットフォーム名
            Me._Vendor = Me.getPlatformInfo(PlatformInfo.Vendor)         'ベンダー情報
            Me._Version = Me.getPlatformInfo(PlatformInfo.Version)       'プラットフォームのバージョン
            Me._Profile = Me.getPlatformInfo(PlatformInfo.Profile)       'プラットフォームのプロファイル
            Me._Extensions = Me.getPlatformInfo(PlatformInfo.Extensions) '拡張情報
            Me._DeviceList = New DeviceCollection                        'デバイス情報
        End Sub
#End Region

#Region "　プラットフォーム情報取得　"
        ''' <summary>
        ''' プラットフォーム情報取得
        ''' </summary>
        ''' <param name="platformInfo">取得するプラットフォーム情報</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Function getPlatformInfo(ByVal platformInfo As PlatformInfo) As String
            Dim parameterValueSize As Integer
            OpenCLAPI.clGetPlatformInfo(Me.ID, platformInfo, 0, Nothing, parameterValueSize)

            Dim result As New System.Text.StringBuilder(parameterValueSize)
            OpenCLAPI.clGetPlatformInfo(Me.ID, platformInfo, parameterValueSize, result, parameterValueSize)
            Return result.ToString()
        End Function
#End Region

#Region "　ToString　"
        ''' <summary>
        ''' ToString
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overrides Function ToString() As String
            With New StringBuilder
                .AppendLine(String.Format("ID：{0}", Me.ID))
                .AppendLine(String.Format("プラットフォーム名：{0}", Me.Name))
                .AppendLine(String.Format("ベンダー情報：{0}", Me.Vendor))
                .AppendLine(String.Format("プラットフォームのバージョン：{0}", Me.Version))
                .AppendLine(String.Format("プラットフォームのプロファイル：{0}", Me.Profile))
                .AppendLine(String.Format("拡張情報：{0}", Me.Extensions))
                Return .ToString
            End With
        End Function
#End Region

    End Class

    ''' <summary>
    ''' プラットフォームを格納するコレクション
    ''' </summary>
    ''' <remarks></remarks>
    Public Class PlatformCollection
        Inherits System.Collections.Generic.List(Of Platform)

#Region "　プラットフォームの読み込み　"
        ''' <summary>
        ''' プラットフォームの読み込み
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub Load()
            Dim platformCount As Integer
            OpenCLAPI.clGetPlatformIDs(0, Nothing, platformCount)

            Dim result As IntPtr() = New IntPtr(platformCount - 1) {}
            OpenCLAPI.clGetPlatformIDs(platformCount, result, platformCount)

            For Each platformID As IntPtr In result
                Me.Add(New Platform(platformID))
            Next
        End Sub
#End Region

    End Class
End Namespace